# Copyright (c) the JPEG XL Project Authors. All rights reserved.
#
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.

set(JPEGXL_MAJOR_VERSION 0)
set(JPEGXL_MINOR_VERSION 6)
set(JPEGXL_PATCH_VERSION 1)
set(JPEGXL_LIBRARY_VERSION
    "${JPEGXL_MAJOR_VERSION}.${JPEGXL_MINOR_VERSION}.${JPEGXL_PATCH_VERSION}")

# This is the library API/ABI compatibility version. Changing this value makes
# the shared library incompatible with previous version. A program linked
# against this shared library SOVERSION will not run with an older SOVERSION.
# It is important to update this value when making incompatible API/ABI changes
# so that programs that depend on libjxl can update their dependencies. Semantic
# versioning allows 0.y.z to have incompatible changes in minor versions.
set(JPEGXL_SO_MINOR_VERSION 6)
if (JPEGXL_MAJOR_VERSION EQUAL 0)
set(JPEGXL_LIBRARY_SOVERSION
    "${JPEGXL_MAJOR_VERSION}.${JPEGXL_SO_MINOR_VERSION}")
else()
set(JPEGXL_LIBRARY_SOVERSION "${JPEGXL_MAJOR_VERSION}")
endif()


# List of warning and feature flags for our library and tests.
if (MSVC)
set(JPEGXL_INTERNAL_FLAGS
  # TODO(janwas): add flags
)
else ()
set(JPEGXL_INTERNAL_FLAGS
  # F_FLAGS
  -fmerge-all-constants
  -fno-builtin-fwrite
  -fno-builtin-fread

  # WARN_FLAGS
  -Wall
  -Wextra
  -Wc++11-compat
  -Warray-bounds
  -Wformat-security
  -Wimplicit-fallthrough
  -Wno-register  # Needed by public headers in lcms
  -Wno-unused-function
  -Wno-unused-parameter
  -Wnon-virtual-dtor
  -Woverloaded-virtual
  -Wvla
)

# Warning flags supported by clang.
if (${CMAKE_CXX_COMPILER_ID} MATCHES "Clang")
  list(APPEND JPEGXL_INTERNAL_FLAGS
    -Wdeprecated-increment-bool
    # TODO(deymo): Add -Wextra-semi once we update third_party/highway.
    # -Wextra-semi
    -Wfloat-overflow-conversion
    -Wfloat-zero-conversion
    -Wfor-loop-analysis
    -Wgnu-redeclared-enum
    -Winfinite-recursion
    -Wliteral-conversion
    -Wno-c++98-compat
    -Wno-unused-command-line-argument
    -Wprivate-header
    -Wself-assign
    -Wstring-conversion
    -Wtautological-overlap-compare
    -Wthread-safety-analysis
    -Wundefined-func-template
    -Wunreachable-code
    -Wunused-comparison
  )
  if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 5.0)
    list(APPEND HWY_FLAGS -Wc++2a-extensions)
  endif()
endif()  # Clang

if (WIN32)
  list(APPEND JPEGXL_INTERNAL_FLAGS
    -Wno-c++98-compat-pedantic
    -Wno-cast-align
    -Wno-double-promotion
    -Wno-float-equal
    -Wno-format-nonliteral
    -Wno-global-constructors
    -Wno-language-extension-token
    -Wno-missing-prototypes
    -Wno-shadow
    -Wno-shadow-field-in-constructor
    -Wno-sign-conversion
    -Wno-unused-member-function
    -Wno-unused-template
    -Wno-used-but-marked-unused
    -Wno-zero-as-null-pointer-constant
  )
else()  # WIN32
  list(APPEND JPEGXL_INTERNAL_FLAGS
    -fsized-deallocation
    -fno-exceptions

    # Language flags
    -fmath-errno
  )

  if (${CMAKE_CXX_COMPILER_ID} MATCHES "Clang")
    list(APPEND JPEGXL_INTERNAL_FLAGS
      -fnew-alignment=8
      -fno-cxx-exceptions
      -fno-slp-vectorize
      -fno-vectorize

      -disable-free
      -disable-llvm-verifier
    )
  endif()  # Clang
endif()  # WIN32

# Internal flags for coverage builds:
if(JPEGXL_ENABLE_COVERAGE)
set(JPEGXL_COVERAGE_FLAGS
    -g -O0 -fprofile-arcs -ftest-coverage -DJXL_DISABLE_SLOW_TESTS
    -DJXL_ENABLE_ASSERT=0 -DJXL_ENABLE_CHECK=0
)
endif()  # JPEGXL_ENABLE_COVERAGE
endif()  #!MSVC

# The jxl library definition.
include(jxl.cmake)

# Other libraries outside the core jxl library.
include(jxl_extras.cmake)
include(jxl_threads.cmake)

# Install all the library headers from the source and the generated ones. There
# is no distinction on which libraries use which header since it is expected
# that all developer libraries are available together at build time.
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/jxl
  DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/jxl
  DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")

# Profiler for libjxl
include(jxl_profiler.cmake)

if(BUILD_TESTING)
# Unittests
cmake_policy(SET CMP0057 NEW)  # https://gitlab.kitware.com/cmake/cmake/issues/18198
include(GoogleTest)

# Tests for the jxl library.
include(jxl_tests.cmake)

# Google benchmark for the jxl library
include(jxl_benchmark.cmake)

endif()  # BUILD_TESTING
